/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.clinicariobamba.Controladores;

import com.clinicariobamba.ReglasNegocio.Clases.Composicion;
import com.clinicariobamba.ReglasNegocio.Clases.Elemento;
import com.clinicariobamba.ReglasNegocio.Clases.ElementoEntrada;
import com.clinicariobamba.ReglasNegocio.Clases.Entrada;
import com.clinicariobamba.ReglasNegocio.Clases.HistoriaClinica;
import com.clinicariobamba.ReglasNegocio.Clases.Paciente;
import com.clinicariobamba.ReglasNegocio.Clases.ProfesionalSalud;
import com.clinicariobamba.ReglasNegocio.Clases.TipoEntrada;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesComposicion;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesElemento;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesElementoEntrada;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesEntrada;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesHistoriaClinica;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesOrganizacionDependencia;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesPaciente;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesTipoEntrada;
import com.clinicariobamba.ReglasNegocio.Funciones.FuncionesXml;
import com.clinicariobamba.Util.MyUtil;
import java.io.Serializable;
import java.util.ArrayList;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import org.primefaces.context.DefaultRequestContext;

/**
 *
 * @author Gis
 */
@ManagedBean
@ViewScoped
public final class ControladorHCE implements Serializable {

    private HistoriaClinica hce;
    private Composicion composicion;
    private Composicion composicionSel;
    private Elemento elementoSel;

    private ArrayList<Entrada> lstEntradas;
    private ArrayList<Composicion> lstComposiciones;
    private ArrayList<Composicion> lstComposicionF;
    private ArrayList<Elemento> lstElementosSV;
    private ArrayList<Elemento> lstElementosMedicamentos;
    private ArrayList<Elemento> lstElementosExamenes;

    private final static String[] descripcionSV;

    static {
        descripcionSV = new String[4];
        descripcionSV[0] = "PRESION SISTOLICA";
        descripcionSV[1] = "PRESION DIASTÓLICA";
        descripcionSV[2] = "OXIGENO EN LA SANGRE";
        descripcionSV[3] = "PULSO";

    }

    public ControladorHCE() {

        lstEntradas = new ArrayList<Entrada>();
        lstElementosSV = new ArrayList<Elemento>();
        lstElementosMedicamentos = new ArrayList<Elemento>();
        lstElementosExamenes = new ArrayList<Elemento>();

        hce = new HistoriaClinica();
        composicion = new Composicion();
        ArrayList<TipoEntrada> tipoEntradas = FuncionesTipoEntrada.obtenerTipoEntradas();
        for (TipoEntrada tipoEntrada : tipoEntradas) {
            // aqui poner el tipo de entrada
            lstEntradas.add(new Entrada(tipoEntrada));
        }
        for (int i = 0; i < 4; i++) {
            lstElementosSV.add(i, new Elemento(descripcionSV[i], "S", true));
        }

    }

    public ArrayList<Composicion> getLstComposicionF() {
        return lstComposicionF;
    }

    public void setLstComposicionF(ArrayList<Composicion> lstComposicionF) {
        this.lstComposicionF = lstComposicionF;
    }

    
    public Composicion getComposicionSel() {
        return composicionSel;
    }

    public void setComposicionSel(Composicion composicionSel) {
        this.composicionSel = composicionSel;
    }

    public HistoriaClinica getHce() {
        return hce;
    }

    public void setHce(HistoriaClinica hce) {
        this.hce = hce;
    }

    public ArrayList<ElementoEntrada> getLstElementoEntrada(int id_entrada) {
        return FuncionesElementoEntrada.obtenerElementoEntrada(id_entrada);
    }

  

    public ElementoEntrada obtenerElementoEntrada(int id) {
        return getLstElementoEntrada(id).get(1);
    }

    public Elemento getElementoSel() {
        return elementoSel;
    }

    public void setElementoSel(Elemento elementoSel) {
        this.elementoSel = elementoSel;
    }

    public ArrayList<Entrada> getLstEntradas() {
        return lstEntradas;
    }

    public Composicion getComposicion() {
        return composicion;
    }

    public void setComposicion(Composicion composicion) {
        this.composicion = composicion;
    }

    public void setLstEntradas(ArrayList<Entrada> lstEntradas) {
        this.lstEntradas = lstEntradas;
    }

    public ArrayList<Elemento> getLstElementosSV() {
        return lstElementosSV;
    }

    public void setLstElementosSV(ArrayList<Elemento> lstElementosSV) {
        this.lstElementosSV = lstElementosSV;
    }

    public ArrayList<Elemento> getLstElementosMedicamentos() {
        return lstElementosMedicamentos;
    }

    public void setLstElementosMedicamentos(ArrayList<Elemento> lstElementosMedicamentos) {
        this.lstElementosMedicamentos = lstElementosMedicamentos;
    }

    public ArrayList<Elemento> getLstElementosExamenes() {
        return lstElementosExamenes;
    }

    public void setLstElementosExamenes(ArrayList<Elemento> lstElementosExamenes) {
        this.lstElementosExamenes = lstElementosExamenes;
    }

    public HistoriaClinica ObtenerHCE(int id_paciente) {
        return FuncionesHistoriaClinica.obtenerHistoriaClinica(id_paciente);
    }

    public ArrayList<Entrada> getLstEntradasComp(int id) {
        return FuncionesEntrada.obtenerEntradas(id);
    }

    public ArrayList<Entrada> getLstEntradasXML(Composicion comp) {

        ArrayList<Entrada> lst = new ArrayList<Entrada>();
        for (Entrada e : comp.getLstentrada()) {
            lst.add(e);
        }
        return lst;
    }

    public ArrayList<Composicion> getLstComposiciones() {
        return lstComposiciones;
    }

    public void setLstComposiciones(ArrayList<Composicion> lstComposiciones) {
        this.lstComposiciones = lstComposiciones;
    }

    public void CargarHCE(String ci) {
        try {
            Paciente pac = FuncionesPaciente.obtenerPacienteCI(ci);

            this.hce = FuncionesHistoriaClinica.obtenerHistoriaClinica(pac.getId_p());
            this.lstComposiciones = FuncionesComposicion.obtenerCodigoHCE(hce.getIdHc());

        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Alerta!!", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }

    public void ObtenerHCEXML() {
        try {
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
            Paciente pac = (Paciente) session.getAttribute("user");
            this.lstComposiciones = FuncionesXml.LeerXMLF(pac.getCi());
            this.hce = new HistoriaClinica(lstComposiciones.get(0).getHistoriaClinica().getIdHc(), pac);
            FacesContext.getCurrentInstance().getExternalContext().redirect(
                    FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()
                    + "/faces/Paciente/HCE_Paciente.xhtml");

        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Alerta!!", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }

    public void guardarHCE() {
        try {
            if (FuncionesPaciente.insertar(hce.getPaciente())) {
                if (FuncionesHistoriaClinica.insertar(hce)) {
                    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
            composicion.setProfesionalSalud((ProfesionalSalud) session.getAttribute("user"));
            composicion.setFecha((new MyUtil()).getFechaActual());
            composicion.getOrganizacionDependencia().setIdOrgDep(
                    FuncionesOrganizacionDependencia.obtenerSoloIDOrgDep(
                            composicion.getOrganizacionDependencia().getOrganizacion().getIdOrganizacion(),
                            composicion.getOrganizacionDependencia().getDependencia().getIdDependencia()));
            composicion.setHistoriaClinica(hce);
            //Aumentar organizacion_deendencia
            //hce = new HistoriaClinica();

            if (FuncionesComposicion.insertar(composicion)) {
                for (Entrada entrada : lstEntradas) {
                    entrada.setComposicion(composicion);
                    if (entrada.getContenido() != null || entrada.getTipoEntrada().getIdTipo() == 7 || entrada.getTipoEntrada().getIdTipo() == 9) {
                        if (!entrada.getContenido().trim().equals("") || entrada.getTipoEntrada().getIdTipo() == 7 || entrada.getTipoEntrada().getIdTipo() == 9) {
                            if (!FuncionesEntrada.insertar(entrada)) {
                                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                        "Alerta!!", "Error al guardar la Entrada");
                                FacesContext.getCurrentInstance().addMessage(null, message);
                                break;
                            }
                        }
                    }
                }
                Elemento elSV = new Elemento();
                elSV.setIdElemento(23);
                elSV.setDescripcion("");
                for (Elemento elemento : lstElementosSV) {
                    elSV.setDescripcion(elSV.getDescripcion() + "\n" + elemento.getDescSoloSV() + ": " + elemento.getDescripcion());
                }

                //if (FuncionesElementoEntrada.insertar(new ElementoEntrada(lstEntradas.get(6), elemento, String.format("%s: %s", elemento.getDescSoloSV(), elemento.getDescripcion())))) {
                if (FuncionesElementoEntrada.insertar(new ElementoEntrada(lstEntradas.get(6), elSV, elSV.getDescripcion()))) {

                } else {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Alerta!!", "Error al guardar el elemento de la entrada");
                    FacesContext.getCurrentInstance().addMessage(null, message);
                }
                for (Elemento elemento : lstElementosMedicamentos) {
                    //elemento.setTipo("M");
                    elemento.setIdElemento(FuncionesElemento.obtenerIDElementoxDesc(elemento.getDescripcion()));
                    if (FuncionesElementoEntrada.insertar(new ElementoEntrada(lstEntradas.get(8), elemento, String.format("/%s/%s.", elemento.getDosisSoloMedicamento(), elemento.getIndicacionOfrecuencia())))) {

                    } else {
                        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                "Alerta!!", "Error al guardar");
                        FacesContext.getCurrentInstance().addMessage(null, message);
                    }
                }
                for (Elemento elemento : lstElementosExamenes) {
                    //elemento.setTipo("E");
                    elemento.setIdElemento(FuncionesElemento.obtenerIDElementoxDesc(elemento.getDescripcion()));
                    if (FuncionesElementoEntrada.insertar(new ElementoEntrada(lstEntradas.get(8), elemento, String.format(", %s", elemento.getIndicacionOfrecuencia())))) {

                    } else {
                        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                "Alerta!!", "Error al guardar el elemento");
                        FacesContext.getCurrentInstance().addMessage(null, message);
                    }
                }
                FuncionesXml.CrearXML(hce, composicion, lstEntradas, lstElementosSV, lstElementosMedicamentos, lstElementosExamenes);
                if (FuncionesXml.validateWithDTDUsingDOM(hce.getPaciente().getCi()))
                {
               FacesContext.getCurrentInstance().getExternalContext().redirect(
                    FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()
                    + "/faces/Profesional_Salud/Ingreso_Exitoso.xhtml");
                }
                else
                {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Alerta!!", "Error al crear XML");
                FacesContext.getCurrentInstance().addMessage(null, message);
                }
            } else {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Alerta!!", "Error al guardar la composicion");
                FacesContext.getCurrentInstance().addMessage(null, message);
            }

                } else {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Alerta!!", "Error al guardar la HCE");
                    FacesContext.getCurrentInstance().addMessage(null, message);
                }
            } else {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Alerta!!", "Error al guardar el paciente");
                FacesContext.getCurrentInstance().addMessage(null, message);
            }
        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Alerta!!", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }

    public void agregarComposicionHCE() {
        try {
            HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(true);
            composicion.setProfesionalSalud((ProfesionalSalud) session.getAttribute("user"));
            composicion.setFecha((new MyUtil()).getFechaActual());
            composicion.getOrganizacionDependencia().setIdOrgDep(
                    FuncionesOrganizacionDependencia.obtenerSoloIDOrgDep(
                            composicion.getOrganizacionDependencia().getOrganizacion().getIdOrganizacion(),
                            composicion.getOrganizacionDependencia().getDependencia().getIdDependencia()));
            composicion.setHistoriaClinica(hce);
            //Aumentar organizacion_deendencia
            //hce = new HistoriaClinica();

            if (FuncionesComposicion.insertar(composicion)) {
                for (Entrada entrada : lstEntradas) {
                    entrada.setComposicion(composicion);
                    if (entrada.getContenido() != null || entrada.getTipoEntrada().getIdTipo() == 7 || entrada.getTipoEntrada().getIdTipo() == 9) {
                        if (!entrada.getContenido().trim().equals("") || entrada.getTipoEntrada().getIdTipo() == 7 || entrada.getTipoEntrada().getIdTipo() == 9) {
                            if (!FuncionesEntrada.insertar(entrada)) {
                                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                        "Alerta!!", "Error al guardar la Entrada");
                                FacesContext.getCurrentInstance().addMessage(null, message);
                                break;
                            }
                        }
                    }
                }
                Elemento elSV = new Elemento();
                elSV.setIdElemento(23);
                elSV.setDescripcion("");
                for (Elemento elemento : lstElementosSV) {
                    elSV.setDescripcion(elSV.getDescripcion() + "\n" + elemento.getDescSoloSV() + ": " + elemento.getDescripcion());
                }

                //if (FuncionesElementoEntrada.insertar(new ElementoEntrada(lstEntradas.get(6), elemento, String.format("%s: %s", elemento.getDescSoloSV(), elemento.getDescripcion())))) {
                if (FuncionesElementoEntrada.insertar(new ElementoEntrada(lstEntradas.get(6), elSV, elSV.getDescripcion()))) {

                } else {
                    FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                            "Alerta!!", "Error al guardar el elemento de la entrada");
                    FacesContext.getCurrentInstance().addMessage(null, message);
                }
                for (Elemento elemento : lstElementosMedicamentos) {
                    //elemento.setTipo("M");
                    elemento.setIdElemento(FuncionesElemento.obtenerIDElementoxDesc(elemento.getDescripcion()));
                    if (FuncionesElementoEntrada.insertar(new ElementoEntrada(lstEntradas.get(8), elemento, String.format("/%s/%s.", elemento.getDosisSoloMedicamento(), elemento.getIndicacionOfrecuencia())))) {

                    } else {
                        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                "Alerta!!", "Error al guardar");
                        FacesContext.getCurrentInstance().addMessage(null, message);
                    }
                }
                for (Elemento elemento : lstElementosExamenes) {
                    //elemento.setTipo("E");
                    elemento.setIdElemento(FuncionesElemento.obtenerIDElementoxDesc(elemento.getDescripcion()));
                    if (FuncionesElementoEntrada.insertar(new ElementoEntrada(lstEntradas.get(8), elemento, String.format(", %s", elemento.getIndicacionOfrecuencia())))) {

                    } else {
                        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                "Alerta!!", "Error al guardar el elemento");
                        FacesContext.getCurrentInstance().addMessage(null, message);
                    }
                }
                FuncionesXml.ActualizarXML(hce, composicion, lstEntradas, lstElementosSV, lstElementosMedicamentos, lstElementosExamenes);
                if (FuncionesXml.validateWithDTDUsingDOM(hce.getPaciente().getCi()))
                {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                        "Información", "Se ha registrado la HCE");
                FacesContext.getCurrentInstance().addMessage(null, message);
                 FacesContext.getCurrentInstance().getExternalContext().redirect(
                    FacesContext.getCurrentInstance().getExternalContext().getRequestContextPath()
                    + "/faces/Profesional_Salud/Ingreso_Exitoso.xhtml");
                }
                
            } else {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                        "Alerta!!", "Error al guardar la composicion");
                FacesContext.getCurrentInstance().addMessage(null, message);
            }
        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Alerta!!", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }

    public void eliminarMedicamento() {
        try {
            lstElementosMedicamentos.remove(elementoSel);

        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Alerta!!", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }

    public void eliminarExamen() {
        try {
            lstElementosExamenes.remove(elementoSel);

        } catch (Exception e) {
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Alerta!!", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }

    public void agregarMedicamento(Elemento elm) {
        try {
            lstElementosMedicamentos.add(elm);
            DefaultRequestContext.getCurrentInstance().execute("wdlgAgregarMed.hide();");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Alerta!!", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, message);

        }
    }

    public void agregarExamen(Elemento elm) {
        try {
            lstElementosExamenes.add(elm);
            DefaultRequestContext.getCurrentInstance().execute("wdlgAgregarExam.hide();");
        } catch (Exception e) {
            System.out.println(e.getMessage());
            FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "Alerta!!", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, message);

        }
    }
    
}
